import com.cloudbees.groovy.cps.NonCPS
import groovy.transform.Field
import hudson.model.ParameterDefinition

/**
 * 参数化构建工具的封装
 * <br>
 *     使用方法1： 构建参数
 *     properties(buildParams{*          str("name","张三","姓名")
 *})
 *     使用方法2：弹窗确认
 *     <p>
 confirm{params{buildParams{str("name","张三","姓名")}}}或
 confirm{params{[
 string(name:"name",defaultValue:"张三",description:"姓名")
 ]}}})
 </p>
 * <br>
 *     注意：properties如果调用多次那么只有一次生效，因此请注意不要调用多次
 */

@Field params = [] as List<ParameterDefinition>

/**
 * 字符串参数
 * @param name
 * @param defaultValue
 * @param description
 * @return
 */
def str(name, defaultValue = "", description = "") {
    params += string(value: "${defaultValue}", defaultValue: "${defaultValue}", description: "${description}", name: name, trim: true)
}

/**
 * 文本参数，与字符参数不同的是，文本可以换行
 * @param name
 * @param defaultValue
 * @param description
 * @return
 */
def txt(name, defaultValue = "", description = "") {
    params += text(value: "${defaultValue}", defaultValue: defaultValue, description: description, name: name)
}

/**
 * 密码参数（尽量也不要用吧，因为是明文的）
 * @param name
 * @param description
 * @return
 */
def pwd(name, description = "密码") {
    params += password(description: description, name: name)
}

/**
 * 布尔参数
 * @param name
 * @param defaultValue
 * @param description
 * @return
 */
def bool(name, boolean defaultValue = false, description = "") {
    params += booleanParam(value: "${defaultValue}", defaultValue: defaultValue, description: description, name: name)
}

/**
 * 从浏览器表单提交中接受一个文件，作为构建参数。上传后的文件将会放在工作空间中指定的位置，你 可以在构建任务中访问并使用它。
 * <br>
 * 这对于很多场景下是有帮助的，例如：
 *  <ol>
 *      <li>让用户基于他们构建出来的成品运行测试。</li>
 *      <li>允许用户在自动化上传、发布、部署过程中替换文件。</li>
 *      <li>通过上传一个数据集来处理数据。</li>
 *  </ol>
 * @param path
 * @param description
 */
def path(path, description = "") {
    if (!path) {
        throw new RuntimeException("文件路径不能为空")
    }
    params += file(description: description ? description : path, name: path)
}

/**
 * 选项
 * @param name 变量名
 * @param options 参数，数组/字符串（用逗号分开）
 * @param description 描述
 * @return
 */
def option(name, options, description = "选项") {
    if (String.class.isAssignableFrom(options.getClass())) {
        options = options.split(",")
    }
    params += choice(choices: options as List, description: description, name: name)
}

/**
 * 获取某个构建的url
 * @param name
 * @param projectName
 * @param description
 */
def project(name, filter, projectName, description = "") {
    params += run(name: name, filter: filter, description: description, projectName: projectName)
}

/**
 * 获取某个成功构建的url
 * @param name
 * @param projectName
 * @param description
 * @return
 */
def successProject(name, projectName, description = "") {
    project(name, 'SUCCESSFUL', projectName, description)
}

/**
 * 获取构建
 * @param name
 * @param projectName
 * @param description
 * @return
 */
def allProject(name, projectName, description = "") {
    project(name, 'ALL', projectName, description)
}

/**
 * 获取完成的构建（不管是否成功）
 * @param name
 * @param projectName
 * @param description
 * @return
 */
def completeProject(name, projectName, description = "") {
    project(name, 'COMPLETED', projectName, description)
}

/**
 * 获取稳定的构建
 * @param name
 * @param projectName
 * @param description
 * @return
 */
def stableProject(name, projectName, description = "") {
    project(name, 'STABLE', projectName, description)
}

/**
 * 用户名密码参数
 * @param name
 * @param required
 * @param description
 */
def passwordCredit(String name, Boolean required = false, description = "") {
    params += credentials(credentialType: 'com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl', description: description, name: name, required: required)
}


/**
 * 构建参数
 * @param closure 回调
 * @param onlyParams 是否用在非构建参数中
 * @return
 */
def call(Closure closure, boolean onlyParams = false) {
    closure.delegate = this
    closure.call()
    if (onlyParams) {
        return params
    } else {
        return [parameters(params)]
    }

}

